package ecom;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

import org.objectweb.jonas.security.auth.callback.*;

import org.ow2.util.log.Log;
import org.ow2.util.log.LogFactory;

import ecom.api.IChercheurRemote;
import ecom.api.IProprietaireRemote;
import ecom.entity.ChercheurEntity;
import ecom.entity.ProprietaireEntity;

/***
 * 
 * @author Alexandra NITU
 * 
 */

@ManagedBean
@SessionScoped
public class CompteLogin implements Serializable {

	private static final long serialVersionUID = 1L;
	private String pseudo;
	private String mdp;// mot de passe
	public ChercheurEntity comptechercheuractif; 						// Reno : compte chercheur logue
	public ProprietaireEntity compteproprietaireactif; 				// Reno : compte proprietaire logue
	private boolean connecte = false;
	private boolean corp; 												// Reno : Type du compte connecte : Chercheur = true; Propietaire = false;
	private int page; 												// Reno : page de provenance
	
	private int sortedMethod = 0;
	
	
	public int getSortedMethod() {
		return sortedMethod;
	}

	public void setSortedMethod(int sortedMethod) {
		this.sortedMethod = sortedMethod;
	}

	public boolean isConnecte() {
		return connecte;
	}

	public void setConnecte(boolean connecte) {
		this.connecte = connecte;
	}

	@ManagedProperty(value="#panierSessionBean")
	private Panier panierSessionBean;
	
	LoginContext loginContext;
	
	private Log log = LogFactory.getLog(CompteLogin.class);

	public Panier getPanierSessionBean() {
		return panierSessionBean;
	}

	public void setPanierSessionBean(Panier panierSessionBean) {
		this.panierSessionBean = panierSessionBean;
	}

	public String getPseudo() {
		comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(pseudo);
		compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(pseudo);
		if(comptechercheuractif == null)
		{
			corp = false;
		} else {
			corp = true;
		}
		return pseudo;

	}
	public String getPseudoSpecial() {
			return pseudo;

	}

	public void setPseudo(String pseudo) {
		this.pseudo = pseudo;
	}

	public String getMdp() {
		return mdp;
	}

	public void setMdp(String mdp) {
		this.mdp = mdp;
	}


	// Reno : Instance pour la recherche de l'utilisateur connecte
	    private IChercheurRemote getInstanceUtilisateurChercheur() {
	        try {
	                    javax.naming.Context ic = new javax.naming.InitialContext();
	            return (IChercheurRemote) ic.lookup("ecom.stateless.ChercheurStateless@Remote");
	        } catch (Exception e) {
	          e.printStackTrace();
	          throw new RuntimeException("Instance utilisateur chercheur introuvable", e);
	        }
	    }
	
	    private IProprietaireRemote getInstanceUtilisateurProprietaire() {
	        try {
	                    javax.naming.Context ic = new javax.naming.InitialContext();
	            return (IProprietaireRemote) ic.lookup("ecom.stateless.ProprietaireStateless@Remote");
	        } catch (Exception e) {
	          e.printStackTrace();
	          throw new RuntimeException("Instance utilisateur proprietaire introuvable", e);
	        }
	    }
	// Reno : Fin
	
	public String login() throws LoginException {
		
		try {
			
				CallbackHandler handler = new NoInputCallbackHandler(pseudo, mdp);
				loginContext = new LoginContext("jaasclientecom",
						handler);
				loginContext.login();
				connecte = true;
				
				// Reno : Recuperation du type d'utilisateur
					comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(pseudo);
					compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(pseudo);
					if(comptechercheuractif == null)
					{
						corp = false;
					} else {
						corp = true;
					}
				// Reno : Fin
			
			if(panierSessionBean!=null)
				panierSessionBean.testPanier();
			else
				log.error("panierSessionBean existe pas");
				FacesMessage error = new FacesMessage("Succes", "Utilisateur connecte");
				FacesContext.getCurrentInstance().addMessage(null, error);
			
		} catch (LoginException e) {
			FacesMessage error = new FacesMessage("Erreur", "Echec de la connection");
			FacesContext.getCurrentInstance().addMessage(null, error);
		}
		
		// Reno : On renvoi vers la page demandee avant de se loguer
		switch(this.page)
		{
			case 1 : if(corp) return "AnnoncesChercheurNouvelle"; else return "AnnoncesProprietaireNouvelle";
			case 2 : if(corp) return "AnnoncesChercheurFavorites"; else return "AnnoncesProprietaireFavorites";
			case 3 : if(corp) return "AnnoncesChercheurPerso"; else return "AnnoncesProprietairePerso";
			case 4 : return "Panier";	
			default : return "AnnoncesRecherche";
		}
		// Reno : Fin	
	}
	
	public String logout() {

		try {
			if (loginContext != null)
			{
				loginContext.logout();
				connecte = false;
				
				FacesContext facesContext = FacesContext.getCurrentInstance();
				ExternalContext externalContext = facesContext.getExternalContext();
				externalContext.invalidateSession();
			
			}
				
			else
				return "error logincontext null";
		} catch (Exception e) {
			FacesMessage error = new FacesMessage("Erreur", "Echec de la deconnection");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "Error log out!";
		}
		pseudo = "";
		mdp = "";
		FacesMessage error = new FacesMessage("Succes", "Utilisateur deconnecte");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesRecherche";
	}


	public boolean isCorp() {
		return corp;
	}

	public void setCorp(boolean corp) {
		this.corp = corp;
	}

	public ChercheurEntity getComptechercheuractif() {
		return comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(pseudo);
	}

	public void setComptechercheuractif(ChercheurEntity comptechercheuractif) {
		this.comptechercheuractif = comptechercheuractif;
	}

	public ProprietaireEntity getCompteproprietaireactif() {
		return compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(pseudo);
	}

	public void setCompteproprietaireactif(ProprietaireEntity compteproprietaireactif) {
		this.compteproprietaireactif = compteproprietaireactif;
	}

	// Reno : on recupere la page demandee avant de se loguer
	public int getPage() {
		return page;	
	}

	public void setPage(int page) {
		this.page = page;
	}
	// Reno : Fin

}
